package agencia;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import agencia.Habitacion;
import agencia.Servicio;
import agencia.exceptions.HabitacionDuplicadaException;
import agencia.exceptions.InexistenteException;
import agencia.exceptions.ServicioDuplicadoException;

public class Hotel implements AgregadorDeServicios{
	
	private List<Servicio> 		listaServicios = null;
	private List<Habitacion> 	listaHabitaciones = null;
	private Lugar				lugar = null;
	private String 				nombre;
	private String 				direccion;
	private String 				pais;
	private String 				ciudad;
	private String 				telefono;
	private int 				categoria;
	private float				precioServicios = 0;
	private Long				id;
	
	public List<Servicio> getListaServicios() {
		return listaServicios;
	}

	public void setListaServicios(List<Servicio> listaServicios) {
		this.listaServicios = listaServicios;
	}

	public List<Habitacion> getListaHabitaciones() {
		return listaHabitaciones;
	}

	public void setListaHabitaciones(List<Habitacion> listaHabitaciones) {
		this.listaHabitaciones = listaHabitaciones;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Hotel(){};
	
	public Hotel(String nombre, String direccion, String pais,
			String ciudad, String telefono, int categoria) {

		listaServicios = new LinkedList<Servicio>();
		listaHabitaciones = new LinkedList<Habitacion>();
		setNombre(nombre);
		setDireccion(direccion);
		setPais(pais);
		setCiudad(ciudad);
		setTelefono(telefono);
		setCategoria(categoria);
		
	}
	
	public List<Servicio> getServicios() {
		return listaServicios;
	}

	public List<Habitacion> getHabitaciones() {
		return listaHabitaciones;
	}
	
	public String getNombre() {
		return nombre;
	}
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	public String getDireccion() {
		return direccion;
	}
	public void setDireccion(String direccion) {
		this.direccion = direccion;
	}
	public String getPais() {
		return pais;
	}
	public void setPais(String pais) {
		this.pais = pais;
	}
	public String getTelefono() {
		return telefono;
	}
	public void setTelefono(String telefono) {
		this.telefono = telefono;
	}
	public int getCategoria() {
		return categoria;
	}
	public void setCategoria(int categoria) {
		this.categoria = categoria;
	}
	
	private void setPrecioServicios(float precio){
		
		this.precioServicios = precio;
	}
	
	private float getPrecioServicios(){
		
		return this.precioServicios;
	}

	public String getCiudad() {
		return ciudad;
	}
	
	public void setCiudad(String ciudad) {
		this.ciudad = ciudad;
	}
	
	public void setLugar(Lugar lugar){
		this.lugar = lugar;		
	}
	
	public Lugar getLugar(){
		return this.lugar;		
	}
	
	public void agregarHabitacion(Habitacion habitacion) throws HabitacionDuplicadaException {
				
		if ((this.listaHabitaciones.contains(habitacion)) == true){
			throw new HabitacionDuplicadaException();
		}
		else {
			this.listaHabitaciones.add(habitacion);
		}
		
	}
	
	public void agregarServicio(Servicio servicio) throws ServicioDuplicadoException {
		
			if ((this.listaServicios.contains(servicio)) == true){
				throw new ServicioDuplicadoException();
			}
			else {
				this.listaServicios.add(servicio);
				setPrecioServicios(getPrecioServicios() + servicio.getPrecio());
			}
	}
	
	public void quitarServicio(Servicio servicio) throws InexistenteException {
		
		if	((this.listaServicios.remove(servicio)) != true){
			throw new InexistenteException("Servicio Inexistente", servicio.toString());
		}
		else {
			setPrecioServicios(getPrecioServicios() - servicio.getPrecio());
		}
	}
		
	public void asignarPrecioHabitaciones(){
		
		for(Iterator<Habitacion> it = listaHabitaciones.iterator(); it.hasNext(); ){
			
			Habitacion habitacion = (Habitacion)it.next();
			habitacion.setPrecioBasico(this.getPrecioServicios());
			
		}
	}

	public String getTipoPadre() {
		
		return "Hotel";
	}
	
	public String toString(){
		
		return this.getNombre();
	}
	
	
}
